package Serialization;

import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.List;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

import Carte.Trajet;
import Carte.Ville;
import Serveur.Serveur;

public class TrajetXML {
	private Serveur serv;

	private static Element racine;	
	private static org.jdom.Document document;

	/**
	 * Constructeur créeant la racine et le document xml.
	 */
	public TrajetXML(Serveur serv)
	{
		this.serv=serv;
		racine = new Element("Trajet");	
		document = new Document(racine);
	}

	/**
	 * méthode pour enregistrer le fichier xml	
	 * @param document
	 * @param fichier
	 */

	public void enregistre(Document document, String fichier)
	{	
		try
		{

			XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());

			sortie.output(document, new FileOutputStream(fichier));
		}
		catch (java.io.IOException e){}
	}

	/**
	 * méthode pour lire les fichiers xml 
	 * @param fichier
	 * @throws Exception
	 */


	public void lireFichier(String fichier) throws Exception
	{
		SAXBuilder sxb = new SAXBuilder();
		document = sxb.build(new File(fichier));
		racine = document.getRootElement();
	}
	/**
	 * Permet de créer le fichié xml des passagers à partir de la liste du serveur
	 * @param Passager passager
	 */
	public void XmlTrajet(Trajet trajet)
	{
		try{
			Element trajet1 = new Element("Trajet"+trajet.getIDTrajet());
			racine.addContent(trajet1);

			Element idTrajet = new Element("IdTrajet");
			idTrajet.setText(trajet.getIDTrajet()+"");
			trajet1.addContent(idTrajet);

			Element villeDep = new Element("VilleDepart");
			villeDep.setText(trajet.getVilleDepart().toString());
			trajet1.addContent(villeDep);

			Element villeArr = new Element("VilleArrivee");
			villeArr.setText(trajet.getVilleArrive().toString());
			trajet1.addContent(villeArr);

			Element dateDep = new Element("DateDepart");
			Element yearD = new Element("Year");
			Element monthD = new Element("Month");
			Element dayD = new Element("Day");
			Element hourD = new Element("Hour");
			Element minuteD = new Element ("Minute");
			yearD.setText(trajet.getDatedepart().get(GregorianCalendar.YEAR)+"");
			monthD.setText(trajet.getDatedepart().get(GregorianCalendar.MONTH)+"");
			dayD.setText(trajet.getDatedepart().get(GregorianCalendar.DAY_OF_MONTH)+"");
			hourD.setText(trajet.getDatedepart().get(GregorianCalendar.HOUR_OF_DAY)+"");
			minuteD.setText(trajet.getDatedepart().get(GregorianCalendar.MINUTE)+"");
			dateDep.addContent(yearD);
			dateDep.addContent(monthD);
			dateDep.addContent(dayD);
			dateDep.addContent(hourD);
			dateDep.addContent(minuteD);
			trajet1.addContent(dateDep);

			Element dateArr = new Element("DateArrivee");
			Element yearA = new Element("Year");
			Element monthA = new Element("Month");
			Element dayA = new Element("Day");
			Element hourA = new Element("Hour");
			Element minuteA = new Element ("Minute");
			yearA.setText(trajet.getDatearrive().get(GregorianCalendar.YEAR)+"");
			monthA.setText(trajet.getDatearrive().get(GregorianCalendar.MONTH)+"");
			dayA.setText(trajet.getDatearrive().get(GregorianCalendar.DAY_OF_MONTH)+"");
			hourA.setText(trajet.getDatearrive().get(GregorianCalendar.HOUR_OF_DAY)+"");
			minuteA.setText(trajet.getDatearrive().get(GregorianCalendar.MINUTE)+"");
			dateArr.addContent(yearA);
			dateArr.addContent(monthA);
			dateArr.addContent(dayA);
			dateArr.addContent(hourA);
			dateArr.addContent(minuteA);
			trajet1.addContent(dateArr);

			Element distance = new Element("Distance");
			distance.setText(trajet.getDistance()+"");
			trajet1.addContent(distance);

			Element idTransport = new Element("IdTransport");
			idTransport.setText(trajet.getIdTransport()+"");
			trajet1.addContent(idTransport);

			enregistre(document,"Trajet.xml");
		}
		catch(Exception e){System.out.println("pbxml");}
	}

	public void XmlTrajet(ArrayList<Trajet> listTrajet)
	{
		clearXml();
		for(int i =0; i<listTrajet.size();i++)
		{
			XmlTrajet(listTrajet.get(i));
		}
	}
	
	/**
	 * Supprimer les elements pre-existants du xml
	 */
	public void clearXml(){
		List listElements = racine.getChildren();
		ArrayList<Element> elements = new ArrayList<Element>();
		for (int i = 0; i<listElements.size(); i++)
		{
			//Element temp = (Element) listElements.get(i);
			elements.add((Element) listElements.get(i));
			//racine.removeChild(temp.getName());
		}
		for(Element aSupprimer : elements){
			racine.removeChild(aSupprimer.getName());
		}		
	}

	public ArrayList<Trajet> creatTrajet()
	{
		try {
			this.lireFichier("Trajet.xml");
			List listTrajet = racine.getChildren();
			ArrayList<Trajet> listeTrajet = new ArrayList<Trajet> ();
			for (int i = 0; i<listTrajet.size(); i++)
			{
				Element temp = (Element) listTrajet.get(i);

				Integer idTrajet = Integer.parseInt(temp.getChild("IdTrajet").getText());

				Ville villeDep = Ville.toVille(temp.getChild("VilleDepart").getText());

				Ville villeArr = Ville.toVille(temp.getChild("VilleArrivee").getText());

				Element dateDep = (Element) temp.getChild("DateDepart");
				Integer yearD= Integer.parseInt(dateDep.getChild("Year").getText());
				Integer monthD= Integer.parseInt(dateDep.getChild("Month").getText());
				Integer dayD= Integer.parseInt(dateDep.getChild("Day").getText());
				Integer hourD= Integer.parseInt(dateDep.getChild("Hour").getText());
				Integer minuteD= Integer.parseInt(dateDep.getChild("Minute").getText());
				
				GregorianCalendar dateGCD = new GregorianCalendar (yearD,monthD,dayD,hourD,minuteD);
				Element dateArr = (Element) temp.getChild("DateArrivee");
				Integer yearA= Integer.parseInt(dateArr.getChild("Year").getText());
				Integer monthA= Integer.parseInt(dateArr.getChild("Month").getText());
				Integer dayA= Integer.parseInt(dateArr.getChild("Day").getText());
				Integer hourA= Integer.parseInt(dateArr.getChild("Hour").getText());
				Integer minuteA= Integer.parseInt(dateArr.getChild("Minute").getText());
				
				GregorianCalendar dateGCA = new GregorianCalendar (yearA,monthA,dayA,hourA,minuteA);
				
				Integer idTransport = Integer.parseInt(temp.getChild("IdTransport").getText());

				Integer distance = Integer.parseInt(temp.getChild("Distance").getText());	

				Trajet trajetTemp = new Trajet(serv, villeDep, villeArr, dateGCD, dateGCA, idTransport, distance, idTrajet);
				
				listeTrajet.add(trajetTemp);
			}
			return listeTrajet;
		}
		catch(Exception e){System.out.println("pbCreatP");return null;}
	}
}

